# coding: utf-8
# -----------------------
# @project：pyqtGui
# @Author ： lizheyan
# @File ：send_request.py
# @Time ： 2021/11/06 17:15:02
# -----------------------
import sys
import time

import requests
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QMainWindow, QApplication
from ui_files.send_request import Ui_Send_Request


class SendRequest(Ui_Send_Request, QMainWindow):
    def __init__(self):
        super(SendRequest, self).__init__()
        self.setupUi(self)
        self.url = None
        self.pushButton.clicked.connect(self.send_action)

    def send_action(self):
        # 发送请求动作
        self.url = self.lineEdit.text()  # 获取输入内容，并把最新的url信息在点击之后重新传给，自己写的线程中
        self.response_data = ResponseData(self.url)
        self.response_data.start()      # 启动线程
        self.response_data.trigger.connect(self.display)    # 线程自定义信号连接的槽函数

    def display(self, data):
        # 由于自定义信号时自动传递一个字符串参数，所以在这个槽函数中要接受一个参数
        self.textBrowser.append(data)       # 把内容显示出来


class ResponseData(QThread):
    # 自定义信号对象。参数str/int/object就代表这个信号可以传一个字符串/数字/任何类型
    trigger = pyqtSignal(str)

    def __init__(self, url):
        # python2中supper格式super(Class,obj).__init__(self,...)
        # python3中可以把子类（Class）省略调-->super().__init__(self,...)
        super(ResponseData, self).__init__()
        # 如果run方法中需要额外参数，可以在构造函数中传参数
        self.url = url

    def run(self) -> None:
        # 重写线程执行的run函数
        # 触发自定义信号
        try:
            response_data = requests.get(self.url).content.decode()
        except Exception as e:
            response_data = e
        # 通过自定义信号把待显示的字符串传递给槽函数，由于自定义信号参数是str类型所以这里也只能是str
        self.trigger.emit(str(response_data))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = SendRequest()
    myWin.show()
    sys.exit(app.exec_())
